#include "dev_table_by_config.h"
#include <string.h>


/**
 * @brief 一个由配置文件得到的设备配置表，表内是下一波需要进一步配置的设备节点
 *          最大支持256.
 * 为什么要用数组，因为链表跑不通……
 */
typedef struct {
    circuit_node_t *config_node[256]; //最大支持256个配置节点
    uint8_t        node_number;
} cfg_node_table_t;





/**
 * @brief 直接连接的节点配置表
 * 
 */
static cfg_node_table_t DirectCfgNodeTable = {
    0
};

/**
 * @brief 间接相连的节点配置表
 * 
 */
static cfg_node_table_t IndirectCfgNodeTable = {
    0
};


static uint8_t is_node_can_append(circuit_node_type_t type)
{
    if( \
            type == TYPE_CTR_CW1320_91A\
        || type == TYPE_MOD_RELAY\
     )
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


/**
 * @brief 清空 设备配置表
 *  直接相连的设备先不要删掉，目前这里直接相连的设备都是91a，后续还需要91a进行操作
 */
void node_table_clear(node_connection_type_t connect_type)
{
    if(connect_type == NODE_DIRECT)
    {
        memset(&DirectCfgNodeTable, 0,sizeof(DirectCfgNodeTable));
    }
    else if(connect_type == NODE_INDIRECT)
    {
        memset(&IndirectCfgNodeTable, 0,sizeof(IndirectCfgNodeTable));
    }
    
}


/**
 * @brief 从设备配置表中获得节点
 *  表中的节点顺序 ，是按照配置文件中 配置节点行号决定的。
 * @param index 
 * @return circuit_node_t* 
 */
circuit_node_t *  node_table_read_one(node_connection_type_t connect_type, uint8_t index)
{
    if(connect_type == NODE_DIRECT)
    {
        return DirectCfgNodeTable.config_node[index];
    }
    else if(connect_type == NODE_INDIRECT)
    {
        return IndirectCfgNodeTable.config_node[index];       
    }
}

/**
 * @brief Get the node number object
 *      获得当前表中的节点数量
 * 
 * @return uint8_t 
 */
uint8_t get_node_number(node_connection_type_t connect_type)
{
    if(connect_type == NODE_DIRECT)
    {
        return DirectCfgNodeTable.node_number;
    }
    else if(connect_type == NODE_INDIRECT)
    {
        return IndirectCfgNodeTable.node_number;       
    }
}




/****************************/

/**
 * @brief 向 直接连接90A的设备配置表中添加设备节点
 * 
 * @param node_ptr 
 * @param op_result 
 */
void direct_node_table_add(circuit_node_t * node_ptr, uint32_t op_result)
{ 
    if(is_node_can_append(node_ptr->node_type))
    {
        uint8_t index = DirectCfgNodeTable.node_number;
        DirectCfgNodeTable.config_node[index] = node_ptr;
        DirectCfgNodeTable.node_number++;

        // TODO: 这里是直接相连的节点，之后的配置,需要根据传入的op_result来判断，是否添加该节点到其他表格内。
        // 例如 某些节点需要添加到 离线判定表中，由特定线程进行遍历完成离线状态判定。


    }
}


/**
 * @brief 向 非直接连接90A的设备配置表中添加设备节点
 * 
 * @param node_ptr 
 */
void indirect_node_table_add(circuit_node_t * node_ptr, uint32_t result)
{ 
    if(is_node_can_append(node_ptr->node_type))
    {
        uint8_t index = IndirectCfgNodeTable.node_number;
        IndirectCfgNodeTable.config_node[index] = node_ptr;
        IndirectCfgNodeTable.node_number++;

        // TODO: 这里是间接相连的节点，填充结束后什么都不做，不对result做处理。
    }
}






void direct_node_table_print()
{
    for(int i = 0; i < DirectCfgNodeTable.node_number; i++)
    {
        debug_log("direct table :%s \n",DirectCfgNodeTable.config_node[i]->dev_description);
    }
}



void indirect_node_table_print()
{
    for(int i = 0; i < IndirectCfgNodeTable.node_number; i++)
    {
        debug_log("indirect table :%s \n",IndirectCfgNodeTable.config_node[i]->dev_description);
    }
}







